Internal Tooling
v1.0 — Internal Tool
A1 SEO Internal Tooling

Shopify MetaSync

Bulk export, edit, and import SEO titles & meta descriptions across Shopify stores — Products, Custom Collections, Smart Collections, Pages, and Blog Posts.

🛍 Products
📁 Custom Collections
🔖 Smart Collections
📄 Pages
📝 Blog Posts
⬇ CSV Export
⬆ Diff & Import
↩ Undo

Shopify MetaSync is a two-file local tool: a Node.js proxy and a browser-based HTML app. The proxy handles authentication with Shopify's Admin API; the HTML app gives you a clean UI to audit, export, edit in Excel, and push back in bulk.

Export
Fetches all SEO titles and meta descriptions from any Shopify store across all resource types into a clean, filterable table.
📊
Audit
Instant stats on missing, short, and over-length titles and descriptions. Filter by type or issue. Character-count badges on every field.
Edit in CSV
Export to CSV, edit freely in Excel or Google Sheets, then import back. The tool diffs every row and only pushes what changed.
Undo
A snapshot is taken before every push. One click reverts all pushed changes back to the original live values.
i How It Works

Why a proxy is needed — and why it's not a big deal

ℹ️
Why can't this be a single HTML file like WP MetaSync? Shopify's Admin API blocks direct browser requests (CORS). Unlike WordPress — where a browser extension can bypass the restriction — Shopify's API actively refuses cross-origin calls. A tiny local proxy runs on your machine, accepts calls from the browser tool, adds your API token, and forwards them to Shopify. Your token never leaves your computer.
What this means in practice You run one command in a terminal before opening the tool, and close it when done. That's the only extra step compared to WP MetaSync. Node.js is almost certainly already installed (it ships with most development environments).
0 Prerequisites

Before you start — check these once

1

Node.js 18 or later

Check by opening a terminal (Command Prompt or PowerShell on Windows) and running:

node --version # should print v18.x.x or higher

If not installed, download from nodejs.org (LTS version). No npm packages are needed — the proxy uses only Node's built-in modules.

2

A modern browser

Chrome, Firefox, Edge — any modern browser works. No extension required.

3

Both files saved to the same folder

Keep shopify-metasync-proxy.js and shopify-metasync.html in the same folder on your machine — e.g. C:\A1SEO\Tools\

Files Included
1 Create a Shopify Admin API Token

Done once per store — takes about 60 seconds

⚠️
Custom app required — not a Partner API key The token must come from a Custom App created inside the specific Shopify store you're working on. A Shopify Partners API key will not work for this. You need one token per store.
1

Open the store's Shopify Admin

Log in to the store via Shopify Partners (or directly). Go to Settings → Apps and sales channels → Develop apps.

2

Allow custom app development (first time only)

If you see a banner saying "Custom app development is disabled", click Allow custom app development and confirm. This is a one-time store-level setting.

3

Create a new custom app

Click Create an app. Give it a recognisable name like "A1 SEO MetaSync". The app developer can be your own email.

4

Configure Admin API scopes

Click Configure Admin API scopes. Enable the following permissions:

ResourceReadWriteWhy
ProductsFetch & update product SEO fields
Custom CollectionsFetch & update custom collection SEO fields
Smart CollectionsFetch & update smart collection SEO fields
Online Store PagesFetch & update page SEO fields
Online Store Blogs & Blog PostsFetch & update blog article SEO fields

Click Save after selecting all permissions. You need all five resource pairs for full functionality — you can tick just the types you plan to use if preferred, but all five is the safest default.

5

Install the app and copy your token

Click Install appInstall. On the next screen, click Reveal token once. Copy the token (starts with shpat_) and save it somewhere safe — you cannot see it again after leaving this page.

⚠️
Save the token in your team's password manager or a secure note. If lost, you'll need to delete the app and create a new one.
2 Start the Proxy

Run this every time you use the tool — takes 3 seconds

1

Open a terminal in the tools folder

On Windows: navigate to your tools folder in File Explorer, then hold Shift and right-click → Open PowerShell window here. Or open Command Prompt and cd to the folder.

2

Run the proxy

node shopify-metasync-proxy.js

You should see:

╔══════════════════════════════════════════════════╗ ║ Shopify MetaSync Proxy — A1 SEO ║ ╠══════════════════════════════════════════════════╣ ║ ✅ Proxy running on http://127.0.0.1:3457 ║ ║ 📂 Open shopify-metasync.html in your browser ║ ║ 🛑 Press Ctrl+C to stop ║ ╚══════════════════════════════════════════════════╝
3

Open the HTML tool

Double-click shopify-metasync.html to open it in your browser. The Proxy Online indicator in the top-right should turn green within a few seconds.

💡
Tip: keep the terminal window open The proxy runs as long as the terminal window is open. When you're done, close the terminal or press Ctrl+C.
3 Exporting Meta Data

Fetch all SEO titles and descriptions from the store

1

Enter your store credentials

On the Export tab, enter the store URL (e.g. mystore.myshopify.com) and your shpat_ token. Leave the API Version on the default unless you have a specific reason to change it.

2

Select resource types

All types are ticked by default: Products, Collections (custom + smart), Pages, and Blog Posts. Untick any you don't need to speed things up. When Collections is ticked, the tool fetches both custom collections and smart collections in a single pass.

3

Click Fetch Meta

The tool fetches everything in paginated batches of 250 (Shopify's maximum per request). A progress bar and live log show what's happening. You can Pause or Stop at any point.

4

Review results

Stats appear immediately: total URLs, missing titles/descriptions, and length issues. Use the filters to drill into problems:

⚠ Missing — rows with no SEO title or no meta description

📏 Too Long — titles over 60 chars, descriptions over 160 chars

5

Download CSV

Click Download CSV. The file is named shopify-meta-[store]-[date].csv and contains all rows (or filtered rows if filters are active).

4 Editing the CSV

The recommended workflow for bulk changes

1

Open in Excel or Google Sheets

The CSV has these columns: type, id, blog_id, handle, url, title, seo_title, seo_description

2

Edit only seo_title and seo_description

Do not modify type, id, blog_id, or handle — these are used to match rows back to the correct Shopify resource. If they're altered, the import will fail or push to the wrong resource.

3

Leave unchanged rows as-is

The import tool diffs every row against the live value before pushing. Unchanged rows are skipped automatically — you don't need to delete them from the CSV.

4

Save as CSV when done

In Excel: File → Save As → CSV UTF-8 (Comma delimited). In Google Sheets: File → Download → CSV.

5 Importing Changes

Diff, review, and push — only changed rows are updated

1

Switch to the Import tab

Enter the same store URL and token (or a different store if you're applying edits cross-store).

2

Upload your edited CSV

Click the upload zone or drag your CSV onto it. The tool parses it instantly and auto-ticks the type checkboxes based on what resource types are in the file.

3

Click Preview Changes

The tool fetches the current live values from Shopify for every row and compares them against your CSV. Each row is tagged:

🟡 Changed — your CSV has a different value to what's live

🟢 New — the live resource had no SEO field; your CSV adds one

⚪ Same — identical; will be skipped

4

Review and deselect rows if needed

Use the filter buttons to see only Changed or New rows. Deselect any you don't want to push. Use the top checkbox to select/deselect all.

5

Click Push Changes

A confirmation prompt shows how many rows will be updated. Confirm to start. A snapshot of the original live values is saved automatically for undo. Changes push at a controlled rate (250ms between requests) to stay within Shopify's API limits.

6 Undoing a Push

Full revert in one click — within the same session

⚠️
Session-only undo The undo snapshot is held in memory and cleared when you close or refresh the browser tab. If you close the tool after pushing, the undo is gone — but you can still restore values manually using the original exported CSV as a reference.
1

Click ↩ Undo after a push

The Undo button appears next to Push Changes after a push completes. Clicking it will re-push the original live values (captured during Preview) back to every row that was changed.

? Troubleshooting & FAQ
The proxy-status badge shows "Proxy Offline" even after running the proxy
The tool pings http://127.0.0.1:3457/health every 5 seconds. If it stays offline: (1) confirm the terminal shows "Proxy running…"; (2) check nothing else is using port 3457 — if so, the proxy prints an "address already in use" error; (3) try restarting the terminal and running the proxy again. Also try a hard refresh of the HTML page (Ctrl+Shift+R).
I get "API 401" errors when fetching
The token is wrong or doesn't have the required scopes. Double-check you copied the full token (it starts with shpat_). Then go back to the custom app in Shopify admin, confirm all four Read+Write permissions are saved and the app is installed. If you recently changed scopes, you may need to reinstall the app.
What's the difference between Custom Collections and Smart Collections?
Custom collections are manually curated — you choose which products belong. Smart collections are rule-based — Shopify automatically includes products that match conditions you set (e.g. tag = "sale"). The tool fetches and updates both in the same pass when Collections is ticked. In the exported CSV and the table, they appear as Custom Collection (blue badge) and Smart Collection (indigo badge) so you can tell them apart. Both use the same SEO fields (metafields_global_title_tag and metafields_global_description_tag) and are updated via their respective API endpoints.
The SEO title/description fields are empty even though they look filled in Shopify
Shopify stores SEO meta in metafields_global_title_tag and metafields_global_description_tag. Some themes or third-party SEO apps (like Plug In SEO or Smart SEO) store these in custom metafields instead. If the export comes back empty, the store is likely using a different storage method — contact the A1 SEO tech team to investigate.
Can I use this on multiple stores?
Yes. Each store needs its own Custom App and token. Just enter the new store URL and token in the credentials fields — no need to restart the proxy. The proxy works with any store; it's just a pass-through.
Is it safe to leave the proxy running all day?
Yes. The proxy only accepts connections from 127.0.0.1 (localhost) — it cannot be reached from outside your machine. It does not log or store your token; it reads it from the request header and forwards it to Shopify, then discards it.
How many API calls does a full export use?
One call per 250 resources, plus one call per blog for blog posts. Collections tick two endpoints (custom + smart), so they each add their own pages. A store with 500 products, 80 custom collections, 40 smart collections, 50 pages, and 2 blogs with 100 posts would use roughly 2 + 1 + 1 + 1 + 2 = 7 calls. Shopify's REST API limit is 40 calls per second (leaky bucket), so even large stores are well within limits.